#!/bin/bash

# 加载通用函数
source "$(dirname "${BASH_SOURCE[0]}")/common.sh"

# 检查服务健康状态
check_service_health() {
    local host_port="$1"
    local endpoint="${2:-/check}"
    local enabled="$3"
    
    debug "开始健康检查: 端口=$host_port, 接口=$endpoint, 启用状态=$enabled"
    
    # 如果健康检查被禁用，直接返回成功
    if ! $enabled; then
        debug "健康检查已禁用，跳过检查"
        return 0
    fi
    
    start_spinner "检查服务健康状态..."
    
    # 通过宿主机端口调用健康检查接口
    debug "尝试访问健康检查接口: http://0.0.0.0:$host_port$endpoint"
    if curl -f -s "http://0.0.0.0:$host_port$endpoint" > /dev/null 2>&1; then
        debug "健康检查请求成功"
        stop_spinner "success" "服务健康检查通过"
        return 0
    else
        debug "健康检查请求失败"
        stop_spinner "error" "服务健康检查失败"
        handle_error "服务健康检查失败: http://0.0.0.0:$host_port$endpoint"
    fi
}

# 等待服务健康
wait_for_health() {
    local service_name="$1"
    local host_port="$2"
    local endpoint="${3:-/check}"
    local enabled="$4"
    local timeout="${5:-300}"  # 默认5分钟超时
    local max_retries=5        # 最大重试次数
    local retry_count=0

    debug "开始等待服务健康: 服务=$service_name, 端口=$host_port, 接口=$endpoint"
    debug "配置: 启用状态=$enabled, 超时时间=$timeout秒, 最大重试次数=$max_retries"

    # 如果健康检查被禁用，直接返回成功
    if ! $enabled; then
        debug "健康检查已禁用，跳过等待"
        return 0
    fi

    start_spinner "正在进行服务健康检查..."
    local start_time=$(date +%s)

    while [ $retry_count -lt $max_retries ]; do
        local current_time=$(date +%s)
        local elapsed=$((current_time - start_time))

        if [ $elapsed -gt $timeout ]; then
            debug "健康检查超时: 已经过$elapsed秒"
            stop_spinner "error" "服务健康检查超时"
            return 1
        fi

        # 检查健康状态
        debug "尝试第$((retry_count + 1))次健康检查: http://0.0.0.0:$host_port$endpoint"
        if curl -f -s "http://0.0.0.0:$host_port$endpoint" > /dev/null 2>&1; then
            debug "健康检查成功"
            stop_spinner "success" "服务健康检查通过"
            return 0
        else
            retry_count=$((retry_count + 1))
            if [ $retry_count -ge $max_retries ]; then
                debug "健康检查失败，已达到最大重试次数: $max_retries"
                stop_spinner "error" "服务健康检查失败，已达到最大重试次数"
                return 1
            fi
            debug "健康检查失败，等待5秒后重试"
            sleep 5
        fi
    done

    # 如果执行到这里，说明超过重试次数
    debug "健康检查最终失败"
    stop_spinner "error" "服务健康检查失败"
    return 1
}
